package com.company;

import java.io.IOException;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

/*弱引用演示 引用队列
-Xmx20m -XX:+PrintGCDetails -verbose:gc

*/
public class C09WeakReference {

    private static final int _4MB = 4 * 1024 * 1024;

    public static void main(String[] args) throws IOException {
//        List<byte[]> list = new ArrayList<>();
//        for (int i = 0; i < 5; i++) {
//            byte[] bytes = new byte[_4MB];
//            list.add(bytes);
//        }
//        System.in.read();


//        弱引用本身也释放 如何实现呢？
//        引用队列
//        本案例：List ->SoftReference->byte[]
        ReferenceQueue<byte[]> referenceQueue= new ReferenceQueue<>();
        List<WeakReference<byte[]>> list= new ArrayList<>();
        for (Integer i=0; i<17; i++){
            // 加入引用队列referenceQueue
            WeakReference<byte[]> reference=new WeakReference<>(new byte[_4MB],referenceQueue);
            list.add(reference);
            System.out.println("第"+(i+1)+"循环");//第14触发Full GC ，触发弱引用对应的对象释放(前面的对象全部为null)
           for(Reference<byte[]> rf:list){
               System.out.print(rf.get()+" ");
           }

        }
        System.out.println("循环结束");

        // 尝试释放弱引用，就是从list中删除弱引用（ 对应的对象已经释放的弱引用）
        Reference<? extends byte[]> poll= referenceQueue.poll();
        while (poll != null)
        {
            list.remove(poll);
            poll= referenceQueue.poll();
        }


//       System.in.read();


    }


}
